from dotenv import load_dotenv
import os
from openai import OpenAI
import json

# 从.env文件中获取API密钥
def get_api_key():
    load_dotenv()  # 加载环境变量文件
    api_key = os.getenv("DEEPSEEK_API_KEY", "")  # 获取DEEPSEEK_API_KEY环境变量
    if not api_key:
        print("DEEPSEEK_API_KEY is not set in the.env file")
        return None  # 如果密钥未设置则返回None
    return api_key

# 根据平台获取API基础URL
def get_base_url(platform="deepseek"):
    default_url = "https://api.deepseek.com"
    if platform == "deepseek":
        return "https://api.deepseek.com"  # 默认返回DeepSeek的API地址
    else:
        print("Unsupported platform. Using default base URL.")
        return default_url  # 不支持的平台返回默认URL

# AI生成转换后的会议纪要
def ai_generate_converted_summary(prompt, **kwargs):
    api_key = get_api_key()  # 获取API密钥
    if not api_key:
        return "API key not found. Please set DEEPSEEK_API_KEY in the.env file."

    # 初始化OpenAI客户端
    client = OpenAI(api_key=api_key, base_url=get_base_url())

    # 构造转换纪要提示词模板
    prompts = f"""
    你是一个专业的会议纪要生成器，你可以根据会议记录生成简洁明了的会议纪要。
    请严格遵守以下规则：
    1、请只返回json格式的会议纪要，不要返回其他内容。
    2、包含字段：
    - title（标题）
    - time（时间）
    - participants（参与人列表）
    - discussions（讨论事项列表）
    - todos（待办事项列表）

    原始会议内容：
    {prompt}
    """

    # 调用API获取转换后的会议纪要
    stream = kwargs.get("stream", True)
    response = client.chat.completions.create(
        model=kwargs.get("model", "deepseek-chat"),  # 使用的模型名称
        messages=[
            {"role": "user", "content": prompts},  # 用户消息内容
        ],
        stream=stream,  # 是否使用流式响应
        max_tokens=kwargs.get("max_tokens", 1000),  # 最大token数限制
        response_format={
            'type': 'json_object'
        }
    )

    print("\nAI整理后的会议纪要：")
    result = ""
    if stream:
        # 处理流式响应
        for chunk in response:
            chunk_content = chunk.choices[0].delta.content
            if chunk_content:  # 确保chunk_content不为空
                result += chunk_content
                print(chunk_content, end='', flush=True)  # 实时打印
    else:
        result = response.choices[0].message.content  # 非流式响应直接获取
        print(result)

    # 将result字符串转为json格式
    result = json.loads(result)  # 使用json.loads函数将字符串转换为字典
    return result

# 将json会议纪要格式化后输出
def format_json_summary(json_summary):
    '''将会议纪要格式化后输出'''
    base_info = [
        f"会议标题：{json_summary.get('title', '')}",
        f"时间：{json_summary.get('time', '')}",
        "参与人：" + "、".join(json_summary.get("participants", []))
    ]

    # 生成讨论事项列表
    discussions = [f"{i}. {item}" for i, item in enumerate(json_summary.get("discussions", []), 1)]
    
    # 生成待办事项列表
    todos = [f"□ {i}. {todo}" for i, todo in enumerate(json_summary.get("todos", []), 1)]
    
    return "\n".join([
        *base_info,
        "\n讨论事项：",
        *discussions,
        "\n待办事项：",
        *todos
    ])

if __name__ == "__main__":
    # 示例使用
    meeting_contents = """2023年11月15日 项目进度讨论会

张总：好，人都到齐了吧？我们开始...等等小王还没来
李经理：张总，小王请假了，他孩子发烧
张总：哦对，那我们开始吧。首先...（手机铃声响起）抱歉我接个电话...喂？啊不是现在...

（10分钟后）

张总：刚才说到哪了？对了，项目进度。那个...小陈你来说说前端进展
陈工：呃...我们遇到了一些技术问题，就是那个API接口...
张总：什么接口？我不是说过要用RESTful吗？
李经理：张总，我们用的是GraphQL...
张总：Graph什么？算了不重要。市场部呢？

市场部小王：我们调研发现用户更喜欢蓝色界面
张总：蓝色？我们logo是橙色的啊！
李经理：其实可以考...
张总：（打断）不行！必须橙色！下一个议题

（有人敲门进来送咖啡）

测试组老刘：我们发现了几十个bug，主要是...
张总：几十个？！你们开发组干什么吃的！
陈工：有些是需求变更导致的...
张总：不要找借口！下周必须解决！

财务小张：张总，预算超支了...
张总：什么？！谁批准的？
李经理：是您上个月签的...
张总：我签的？不可能！把文件拿来我看看

（翻文件声）

产品经理：关于下个季度的roadmap...
张总：road什么？说人话！
产品经理：就是产品规划...
张总：哦，那个啊，我觉得应该加个聊天功能
众人：可是用户调研显示...
张总：我不管！必须加！

（电话铃声再次响起）

张总：喂？哦董事长啊...是是是...好的马上处理
（挂电话）董事长要我们明天交报告！今晚加班！

李经理：可是明天是周六...
张总：周六怎么了？创业公司就要有创业公司的样子！

（众人小声议论）

运维组：服务器又挂了...
张总：又怎么了？！
运维组：流量太大，需要扩容...
张总：扩什么扩！优化代码不行吗？

（突然停电）

张总：这破办公室！行政呢？
行政：在找物业了...
（10分钟后电来了）

张总：好，继续...说到哪了？
李经理：服务器扩容...
张总：哦对，那个...算了先吃饭吧
众人：现在才10点半...
张总：那就继续！陈工你那个接口...

（有人手机响了）

张总：谁的手机？！不是说了静音吗！
李经理：张总...是您的手机...
张总：哦...喂？啊董事长...

（会议在混乱中继续进行...）"""

    # 调用AI生成转换后的会议纪要
    converted_summary = ai_generate_converted_summary(meeting_contents)
    
    # 格式化输出
    formatted_summary = format_json_summary(converted_summary)
    print("\n\n格式化后的会议纪要：")
    print(formatted_summary)
